#include <string>
#include <iostream>
#include "ValidationUtils.h"
#include "Zuma.h"
#include "DomGenerator.h"
#include <math.h>
#include <map>
#include <SDL_thread.h>

using namespace std;


string getConfigFileName(int, char**);

int main(int argc, char** argv){
	try{
		system("CLS");
		string configFileName = getConfigFileName(argc, argv);
		DomGenerator * generator = new DomGenerator();
		generator->initialize(configFileName);

		list<Element * > * stagesAsElement = DaoFactory::getInstance()->getDao("Stage")->findAll();
		list<Stage * > * stages = new list<Stage * >();
		list<Element*>::iterator iterStagesElement;
		for (iterStagesElement = stagesAsElement->begin();iterStagesElement != stagesAsElement->end();iterStagesElement++)		{
			stages->push_front((Stage*)*iterStagesElement);
		}
		Zuma * zuma = new Zuma();
		zuma->setStages(stages);

		list<SDL_Thread *> * threads = new list<SDL_Thread *>();
		list<Stage * >::iterator iterStages; //Esto es redundante, pero no se todavia donde conviene q quede!
		for (iterStages = stages->begin();iterStages != stages->end();iterStages++){
			zuma->startStage(*iterStages);
		}

		delete zuma;
		threads->clear();
		stagesAsElement->clear();
		delete generator;

	}catch(InitializationException e){
		cout << "\nSe produjo un error durante la inicializacion del juego.\nVerifique el log para mas detalles." <<endl;
		system("PAUSE");
	}catch(...) {
		cout << "Se produjo un error durante el procesamiento." << endl;
		system("PAUSE");
	}
	delete LogFactory::getInstance();
	return 0;
}

string getConfigFileName(int argc, char* argv[])
{
	string configFileName;
	if(argc >= 2)
	{
		configFileName = string(argv[1]);
	}
	else
	{
		configFileName = "stages\\default.esc";
	}

	bool isValidFileName = false;
	do
	{
		// vemos si es un nombre de archivo valido
		isValidFileName = ValidationUtils::fileExists(configFileName);
		if(!isValidFileName)
		{
			if(configFileName.length() > 0)
			{
				cout << "No es posible abrir el archivo: " << configFileName << "\n";
			}
			cout << "Ingrese un nombre de archivo valido de configuracion para Zuma: ";
			getline(cin, configFileName);
		}
	} while(!isValidFileName);

	return configFileName;
}
